﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using CivilisationLib;

namespace IHM
{


    
    /// <summary>
    /// Logique d'interaction pour NouvellePartie.xaml
    /// </summary>
    public partial class NouvellePartie : Window
    {

        public NouvellePartie()
        {
            InitializeComponent();       
        }

        /// <summary>
        /// Lance la création d'une carte en fonction de la configuration renseignée
        /// </summary>
        /// <returns></returns>
        public Carte creerCarte()
        {
            if ((bool)Petite.IsChecked) return new Petite();
            else return new Normale();
        }

        /// <summary>
        /// Renvoie le nombre de joueur coché.
        /// </summary>
        /// <returns></returns>
        public int nbJoueur()
        {
            int nbj = 2;
            if ((bool)nbj3.IsChecked) nbj = 3;
            if ((bool)nbj4.IsChecked) nbj = 4;
            return nbj;
        }

        /// <summary>
        /// Vérifie qu'au moins deux civilisations sont différentes
        /// </summary>
        /// <param name="lciv"></param>
        /// <param name="nbj"></param>
        /// <returns></returns>
        public bool civilisationDifferente(List<int> lciv, int nbj)
        {
            bool res = false;
            int civ = lciv[0];
            for (int i = 1; i < nbj; i++)
            {
                res = res || (lciv[i] != civ);
            }
            return res;
        }

        /// <summary>
        /// Verifie que les pseudos sont tous différents
        /// </summary>
        /// <param name="lpse"></param>
        /// <param name="nbj"></param>
        /// <returns></returns>
        public bool pseudosDifferents(List<string> lpse, int nbj)
        {
            bool res = true;
            string pse = lpse[0];
            for (int i = 1; i < nbj; i++)
            {
                res = res && (lpse[i] != pse);
            }
            return res;
        }

        /// <summary>
        /// Crée la liste de civilisation en fonction de la configuration
        /// </summary>
        /// <returns></returns>
        public List<int> listCivil()
        {
            List<int> lciv = new List<int>();
            lciv.Add(civ1.SelectedIndex);
            lciv.Add(civ2.SelectedIndex);
            lciv.Add(civ3.SelectedIndex);
            lciv.Add(civ4.SelectedIndex);
            return lciv;
        }

        /// <summary>
        /// Crée la liste de pseudonyme renseignés
        /// </summary>
        /// <returns></returns>
        public List<string> listPseudo()
        {
            List<string> lpseudo = new List<string>();
            lpseudo.Add(pseudoj1.Text);
            lpseudo.Add(pseudoj2.Text);
            lpseudo.Add(pseudoj3.Text);
            lpseudo.Add(pseudoj4.Text);
            return lpseudo;
        }

        /// <summary>
        /// Crée la partie, et lance la partie
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void lancerPartie(object sender, RoutedEventArgs e)
        {
            int nbj = nbJoueur();
            List<int> lciv = listCivil();
            List<string> lpse = listPseudo();
            if (!(civilisationDifferente(lciv, nbj)))
            {
                MessageBoxResult civDif = MessageBox.Show("Veuillez indiquer au moins 2 civilisations différentes !", "Pas possib'");
            }
            else if (!(pseudosDifferents(lpse, nbj)))
            {
                MessageBoxResult civDif = MessageBox.Show("Tous les pseudonymes doivent être différents !", "Pas possib'");
            }
            else
            {
                Partie p = new Partie(nbj, creerCarte());
                Partie.creerPartie(p, lciv, lpse, nbj);
                CarteIHM carte = new CarteIHM(p);
                App.Current.MainWindow = carte;
                this.Close();
                carte.Show();
            }
        }


        private void normaleCarteChecked(object sender, RoutedEventArgs e)
        {
            Normale.IsChecked = true;
        }

        private void petiteCarteChecked(object sender, RoutedEventArgs e)
        {
            Petite.IsChecked = true;
        }

        private void Retour(object sender, RoutedEventArgs e)
        {
            MenuPrincipal menu = new MenuPrincipal();
            App.Current.MainWindow = menu;
            this.Close();
            menu.Show();
        }
    }
}
